<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 判断this指向
        //1、强制绑定：如果函数被call/apply/bind调用，则指向他们的第一个参数
        function fn1 (){
            console.log('fn1');
        }
        fn1.call({}); //this指向{}
        fn1.call(null); //this指向对象window
        fn1.call(undefined);  //this指向对象window
        fn1.call(1)   //this指向Obeject（1）
        fn1.call('abc')   //this指向Obeject（'abc'）

        //2、函数时否被new调用，如果被new调用，则指向实例化对象
        function fn2 (){
            console.log('fn2');
        }
        new fn2();  //指向实例化对象
        new fn2;  //new会调用函数，不传参可以不加括号。指向实例化对象

        //3、函数是都被上下文对象调用
        const Obj = {
            fn(){
                console.log(this);
            }
        }

        Obj.fn();  //this指向Obj
        const ex = Obj.fn    
        ex() //ex的this指向window

        // 4、默认调用（）
        function fn3 (){
            console.log('fn3');
        }

        fn3()  //指向window    严格模式下指向undefined（因为找不到调用对象）

        // 5、在js环境中直接打印this
        console.log(this);  // window
    </script>
</body>
</html>